package com.example.tech34Base64.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Encoder;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Base64的使用：照片与字符串的转化
 */
public class Base64Util {

    private static final Logger LOGGER = LoggerFactory.getLogger(Base64Util.class);

    /**
     * 根据文件路径获取base64
     *
     * @param path 文件地址
     * @return base64字符串
     */
    public static String getBase64ByPath(String path) {
        String base64 = null;
        try {
            File file = new File(path);
            if(file.exists() && file.isFile()){
                InputStream in = new FileInputStream(file);
                base64 = getBase64ByIS(in);
            }
        } catch (IOException e) {
            LOGGER.error("path获取base64失败："+e.getMessage(),e);
        }
        return base64 ;
    }

    /**
     * inputstream转为base64的图片字符
     * @param inputStream 文件流
     * @return base64字符串
     */
    public static String getBase64ByIS(InputStream inputStream) {
        byte[] data = null;
        try {
            data = new byte[inputStream.available()];
            inputStream.read(data);
        } catch (IOException e) {
            LOGGER.error("inputStream转化String失败：" + e.getMessage(), e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    LOGGER.error("inputStream转化String失败：关闭流文件失败：" + e.getMessage(), e);
                }
            }
        }
        //Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);
    }

    /**
     * base64转multipartFile
     * 没有后缀的，自动设置为：image/jpg
     * 格式要求：UTF-8
     * ————————————————
     * 主题名称：Base64如何转MultipartFile（对流行实现类BASE64DecodedMultipartFile的修正）
     * 版权声明：本文为CSDN博主「ShuSheng007」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/ShuSheng0007/article/details/118230374
     * */
    public static MultipartFile base64Convert(String base64) {
        //base64编码后的图片有头信息所以要分离出来：data[1]：图片内容为索引  data[0]:image/png;base64,
        //传入数据格式://String base64 = "......";
        final String[] base64Array = base64.split(",");
        String dataUir, data;
        if (base64Array.length > 1) {
            dataUir = base64Array[0];
            data = base64Array[1];
        } else {
            //根据你base64代表的具体文件构建
            dataUir = "data:image/jpg;base64";
            data = base64Array[0];
        }
        MultipartFile multipartFile = new Base64ToMultipartFile(data, dataUir);
        return multipartFile;
    }
}
